<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>
    <script>
        function fun(n, o) {
            console.log(o);
            return {
                fun(m) {
                    return fun(m, n);
                } 
            }
        }
        var a = fun(0);
        a.fun(1);
        a.fun(2);
        a.fun(3);
        var b = fun(0).fun(1).fun(2).fun(3);
        var c = fun(0).fun(1);
        c.fun(2);
        c.fun(3);

        
        // undefined0 0 0
        // undefined0 1 2
        // undefined 0 1 1
        // 析答案解析:
        //     1. 考点: 闭包;
        // 2. 此处有一个坑是var a和var b两行代码， 第 - -。
        //     行， 不同命令之间使用的是分号， 即执行了多条
        // 语。 第二行， 不同命令之间使用的是点号， 表示
        // 的是调用;
        // 3. 执行fun时会返回 - -个函数， 返回的函数当
        // 中， 使用了n这个变量， 而n这个变量， 恰好是
        // 父级函数的形参， 此时构成闭包， n这个变量并
        // 没有被释放， 在第二次调用的时候， n使用的是
        // 第一次调用后得到的值， 以此类推;
        // 4.
        // var a所在行的代码， 相当于是每个都是基于
        // a执行的;
        // var b所在行的代码， 每次都是基于前
        // 面执行的返回值执行的。 对于c, 如果能够理解
        // a和b， 相信c也就能够看懂了， 它是a和b的整合
        // 与变体;
        // 5. 必须说这道题需要对闭包有理解， 不然很容
        // 易掉进坑里。
    </script>
</body>

</html>